#include <vector>
#include <algorithm>
#include <fstream>
#include <iostream>

using namespace std;

struct Milking
{
    int begin;
    int end;
};

// 为 Milking 自定义一个 小于比较操作符。
// 我们自己告诉 C++，Milking 的小于比较规则
// l < r
bool operator<(const Milking &l, const Milking &r)
{
    return l.begin < r.begin;
}

int main(int argc, char const *argv[])
{
    // 处理输入
    ifstream ifs("milk2.in");
    int n = 0;
    ifs >> n;

    vector<Milking> records;

    for (int i = 0; i < n; ++i)
    {
        int b = 0, e = 0;
        ifs >> b >> e;
        Milking m{b, e};
        records.push_back(m);
    }

    sort(records.begin(), records.end());

    /*
    TODO:
    至此，所有农夫挤奶的起始时间，就从大到小排序了。接下来，我们遍历 records，
    对于每一个遍历到的当前的挤奶记录 curr，我们不断向后遍历剩余的挤奶记录。
    */

    Milking curr = records.front();
    int maxmilking = curr.end - curr.begin;//最长挤奶时间
    int maxnomilking = 0;//最长空闲时间

    for (int i = 1; i < records.size(); ++i)
    {
        /*
        TODO:
        1. 如果 curr 和 records[i] 是右侧交叉的情况：

        这说明 records[i] 的结束时间会导致有牛在喂奶的时间延长，此时，我们应该记录下新的结束时间点。

        2. 如果 curr 和 records[i] 是右侧超出的情况，这可能会导致两种结果：

        - 会出现一段新的没有牛喂奶的时间，我们要计算出这个时间，并和历史值做比较
        - 计算这个 records[i] 之前能获得的最大有牛挤奶的时间，并把这个时间和 records[i].end - records[i].begin
        比较，取较大的一个值作为最大的有牛挤奶的时间。并把 records[i] 设置为 curr。
        */
        if (curr.end >= records[i].begin && curr.end < records[i].end)
        { //情况：交叉 c.begin--r.begin--c.end--r.end
            maxmilking = max(records[i].end - curr.begin, maxmilking);

            //更新curr
            curr.end = records[i].end;
        }
        else if (curr.end < records[i].begin)
        { //情况：分离 c.begin--c.end--r.begin--r.end
            maxnomilking = max(records[i].begin - curr.end, maxnomilking);
            maxmilking = max(records[i].end - records[i].begin, maxmilking);

            //更新curr
            curr.begin = records[i].begin;
            curr.end = records[i].end;
        }
        else
        { //情况：包含（不处理) c.begin--r.begin--r.end--c.end
        }
    }

    return 0;
}
